const { Sequelize, DataTypes } = require('sequelize');
const dayjs = require('dayjs');
const timezone = require('dayjs/plugin/timezone');
const utc = require('dayjs/plugin/utc');
dayjs.extend(utc);
dayjs.extend(timezone);
dayjs.tz.setDefault('PRC');
// 从环境变量中读取数据库配置
const {
  MYSQL_USERNAME = 'root',
  MYSQL_PASSWORD = '123456aA',
  MYSQL_ADDRESS = 'sh-cynosdbmysql-grp-20d9gmog.sql.tencentcdb.com:22530',
} = process.env;
// const { MYSQL_USERNAME = 'root', MYSQL_PASSWORD = '123456aA', MYSQL_ADDRESS = "10.29.106.184:3306" } = process.env;
const [host, port] = MYSQL_ADDRESS.split(':');
const sequelize = new Sequelize('nodejs_demo', MYSQL_USERNAME, MYSQL_PASSWORD, {
  host,
  port,
  dialect: 'mysql' /* one of 'mysql' | 'mariadb' | 'postgres' | 'mssql' */,
  timezone: '+08:00', // 东八区
});
// 定义数据模型
// const Counter = sequelize.define('Counter', {
//   count: {
//     type: DataTypes.INTEGER,
//     allowNull: false,
//     defaultValue: 1,
//   },
// });
const Vip = sequelize.define('Vip', {
  id: { type: DataTypes.INTEGER, allowNull: false, primaryKey: true, autoIncrement: true },
  code: { type: DataTypes.STRING, allowNull: false, defaultValue: '' },
  /** 有效起始时间 */
  expiredStart: { type: DataTypes.STRING, allowNull: true, defaultValue: '' },
  /** 有效期终止时间 */
  expired: { type: DataTypes.STRING, allowNull: true, defaultValue: '' },
  // 起始有效日
  firstExpiredDays: { type: DataTypes.INTEGER, allowNull: false, defaultValue: 0 },
  isDelete: { type: DataTypes.INTEGER, allowNull: false, defaultValue: 0 },
  // 备注
  remark: { type: DataTypes.STRING, allowNull: true },
  // 是否支持多人使用
  isMultiUser: { type: DataTypes.INTEGER, allowNull: false, defaultValue: 0 },
  // 绑定的openId
  bindOpenId: { type: DataTypes.STRING, allowNull: true },
});
const User = sequelize.define('User', {
  id: { type: DataTypes.INTEGER, allowNull: false, primaryKey: true, autoIncrement: true },
  name: { type: DataTypes.STRING, allowNull: false, defaultValue: '' },
  openId: { type: DataTypes.STRING, allowNull: false, defaultValue: '' },
  avatar: { type: DataTypes.STRING, allowNull: false, defaultValue: '' }, // 头像
  remark: { type: DataTypes.STRING, allowNull: false, defaultValue: '' }, // 备注
  ygoPrintTimes: { type: DataTypes.INTEGER, allowNull: false, defaultValue: 3 }, // 游戏王印卡次数
  rdPrintTimes: { type: DataTypes.INTEGER, allowNull: false, defaultValue: 3 }, // RD印卡次数
  ygoTotalPrintTimes: { type: DataTypes.INTEGER, allowNull: false, defaultValue: 0 }, // ygo印卡总数
  rdTotalPrintTimes: { type: DataTypes.INTEGER, allowNull: false, defaultValue: 0 }, // RD印卡总数
  isDelete: { type: DataTypes.INTEGER, allowNull: false, defaultValue: 0 }, // 是否已删除
  lastLoginTime: { type: DataTypes.DATE, allowNull: false, defaultValue: dayjs.tz().toDate() }, // 最后登录时间
});
// 卡图
const CardPic = sequelize.define('CardPic', {
  id: { type: DataTypes.INTEGER, allowNull: false, primaryKey: true, autoIncrement: true },
  cardId: { type: DataTypes.STRING, allowNull: false, defaultValue: '' },
  url: { type: DataTypes.STRING, allowNull: false, defaultValue: '' },
  remark: { type: DataTypes.STRING, allowNull: false, defaultValue: '' }, // 备注
  tag: { type: DataTypes.STRING, allowNull: false, defaultValue: '' }, // 标签
  isDelete: { type: DataTypes.INTEGER, allowNull: false, defaultValue: 0 }, // 是否已删除
  isDoujin: { type: DataTypes.INTEGER, allowNull: false, defaultValue: 0 }, // 是否同人图
});
// 媒体校验
const MediaCheck = sequelize.define('MediaCheck', {
  id: { type: DataTypes.INTEGER, allowNull: false, primaryKey: true, autoIncrement: true },
  traceId: { type: DataTypes.STRING, allowNull: false, defaultValue: '' }, // 回调用的跟踪ID
  openId: { type: DataTypes.STRING, allowNull: false, defaultValue: '' },
  result: { type: DataTypes.STRING(500), allowNull: true, defaultValue: '' }, // 回调结果
  url: { type: DataTypes.STRING, allowNull: false, defaultValue: '' }, // 媒体链接
  expired: { type: DataTypes.DATE, allowNull: false, defaultValue: dayjs.tz().toDate() }, // 过期时间
  // cardId: { type: DataTypes.STRING, allowNull: false, defaultValue: '' },
  // url: { type: DataTypes.STRING, allowNull: false, defaultValue: '' },
  // remark: { type: DataTypes.STRING, allowNull: false, defaultValue: '' }, // 备注
  // tag: { type: DataTypes.STRING, allowNull: false, defaultValue: '' }, // 标签
  // isDelete: { type: DataTypes.INTEGER, allowNull: false, defaultValue: 0 }, // 是否已删除
  // isDoujin: { type: DataTypes.INTEGER, allowNull: false, defaultValue: 0 }, // 是否同人图
});
// 广告配置
const AdConfig = sequelize.define('AdConfig', {
  id: { type: DataTypes.INTEGER, allowNull: false, primaryKey: true, autoIncrement: true },
  adKey: { type: DataTypes.STRING, allowNull: false, defaultValue: '' }, // 广告唯一Key
  advertiser: { type: DataTypes.STRING, allowNull: false, defaultValue: '' }, // 广告主备注，可以是QQ号，群主名称等
  // 广告类型，cpc每次点击，cpm千次预览，cpa每次行动，cpr每次回应，cpp每次购买
  type: { type: DataTypes.STRING, allowNull: false, defaultValue: '' },
  // 投放时间-开始时间和结束时间
  releaseStart: { type: DataTypes.DATE, allowNull: false, defaultValue: dayjs.tz().toDate() },
  releaseEnd: { type: DataTypes.DATE, allowNull: false, defaultValue: dayjs.tz().toDate() },
  isDelete: { type: DataTypes.INTEGER, allowNull: false, defaultValue: 0 }, // 是否已删除
  order: { type: DataTypes.INTEGER, allowNull: false, defaultValue: 0 }, // 排序，越大的广告主越优先展示
});
// 广告投放位置
const AdPosition = sequelize.define('AdPosition', {
  id: { type: DataTypes.INTEGER, allowNull: false, primaryKey: true, autoIncrement: true },
  adKey: { type: DataTypes.STRING, allowNull: false, defaultValue: '' }, // 广告唯一Key
  // 投放页面，以页面路径作为值
  pagePath: { type: DataTypes.STRING, allowNull: false, defaultValue: '' },
  // 投放的页面位置
  position: { type: DataTypes.STRING, allowNull: true, defaultValue: '' },
  // 广告图
  adImgUrl: { type: DataTypes.STRING, allowNull: false, defaultValue: '' },
  // 行为类型，openQQGroup-打开QQ群
  actionType: { type: DataTypes.STRING, allowNull: false, defaultValue: '' },
  // 行为用的数据，比如actionType是openQQGroup，这里是群号
  actionData: { type: DataTypes.STRING, allowNull: false, defaultValue: '' },
  isDelete: { type: DataTypes.INTEGER, allowNull: false, defaultValue: 0 }, // 是否已删除
});
// 广告访问记录
const AdViewRecord = sequelize.define('AdViewRecord', {
  id: { type: DataTypes.INTEGER, allowNull: false, primaryKey: true, autoIncrement: true },
  adKey: { type: DataTypes.STRING, allowNull: false, defaultValue: '' }, // 广告唯一Key
  // 行动类型，click点击，view预览
  actionType: { type: DataTypes.STRING, allowNull: false, defaultValue: '' },
  openId: { type: DataTypes.STRING, allowNull: false, defaultValue: '' },
  // actionTime: { type: DataTypes.DATE, allowNull: false, defaultValue: dayjs.tz().toDate() }, // 行动时间
  positionId: { type: DataTypes.INTEGER, allowNull: false, defaultValue: 0 }, // 点击的广告位置ID
});
// AI关键字
const AiKeywords = sequelize.define('AiKeywords', {
  id: { type: DataTypes.INTEGER, allowNull: false, primaryKey: true, autoIncrement: true },
  type: { type: DataTypes.STRING(2000), allowNull: false, defaultValue: '' },
  keywords: { type: DataTypes.STRING(2000), allowNull: false, defaultValue: '' },
});
// 系统配置
const SysConfig = sequelize.define('SysConfig', {
  id: { type: DataTypes.INTEGER, allowNull: false, primaryKey: true, autoIncrement: true },
  key:{ type: DataTypes.STRING, allowNull: false, defaultValue: '' },
  value:{ type: DataTypes.STRING, allowNull: false, defaultValue: '' },
  remark:{ type: DataTypes.STRING, allowNull: false, defaultValue: '' },
});
// 数据库初始化方法
async function init() {
  // await Counter.sync({ alter: true });
  await Vip.sync({ alter: true });
  await User.sync({ alter: true });
  await CardPic.sync({ alter: true });
  await MediaCheck.sync({ alter: true });
  await AdConfig.sync({ alter: true });
  await AdPosition.sync({ alter: true });
  await AdViewRecord.sync({ alter: true });
  await AiKeywords.sync({ alter: true });
  await SysConfig.sync({ alter: true });
}
// 导出初始化方法和模型
module.exports = {
  init,
  // Counter,
  Vip,
  User,
  CardPic,
  MediaCheck,
  AdConfig,
  AdPosition,
  AdViewRecord,
  AiKeywords,
  SysConfig,
};
